package xyz.mumuwei.youthcourseserver.service;

import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.extension.service.IService;
import org.quartz.SchedulerException;
import org.springframework.ui.Model;
import xyz.mumuwei.youthcourseserver.common.dto.PageDto;
import xyz.mumuwei.youthcourseserver.common.lang.Result;
import xyz.mumuwei.youthcourseserver.pojo.Order;
import xyz.mumuwei.youthcourseserver.pojo.UserInfo;

import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;

/**
 * @author mumuwei
 * @since 2022-02-19
 */
public interface OrderService extends IService<Order> {

    /**
     * 分页获取订单列表
     * @param pageDto 分页参数
     * @return 查询结果
     */
    Result getOrderPage(PageDto pageDto);

    /**
     * 获取订单列表
     * @return 订单列表
     */
    Result getOrderList();

    /**
     * 创建订单
     * @param order 订单信息
     * @return 跳转支付宝 html
     * @throws AlipayApiException 支付宝请求异常
     * @throws SchedulerException 定时任务异常
     */
    Result createOrder(Order order) throws AlipayApiException, SchedulerException;

    /**
     * 更新学员信息
     * @param info 学员信息
     * @return 更新结果
     */
    Result updateStudent(UserInfo info);

    /**
     * 根据订单编号删除订单
     * @param code 订单编号
     * @return 删除结果
     */
    Result deleteByOrderId(String code);

    /**
     * 根据订单编号，请求支付宝，查询订单状态
     * @param code 订单编号
     * @throws AlipayApiException 支付宝请求异常
     */
    void queryOrderInAlipayByCode(String code) throws AlipayApiException;

    /**
     * 处理支付宝异步通知请求
     * @param request 请求对象
     * @throws AlipayApiException 支付宝请求异常
     * @throws ParseException 格式化日期异常
     */
    void alipayNotifyHandle(HttpServletRequest request) throws AlipayApiException, ParseException;

    /**
     * 根据订单编号获取订单信息
     * @param code 订单编号
     * @return 查询的订单信息
     */
    Result getOrderByCode(String code);

    /**
     * 学生前台购买课程
     * @param order 订单信息
     * @param uid 用户账户id
     * @param isWeb 是否Pc端支付， false则为移动端支付
     * @return 支付宝跳转表单
     * @throws AlipayApiException 支付宝异常
     * @throws SchedulerException 定时任务异常
     */
    Result createByStudent(Order order, Integer uid, Boolean isWeb) throws AlipayApiException, SchedulerException;

    /**
     *  分页 根据学生id获取订单列表
     * @param pageDto 分页参数
     * @return 订单列表
     */
    Result getByStudentId(PageDto pageDto);

    /**
     * 根据用户id和订单编号校验信息，并创建支付宝订单
     * @param orderId 订单id
     * @param model 视图
     * @throws AlipayApiException 支付宝异常
     */
    void createWapAlipay(String orderId, Model model) throws AlipayApiException;

    /**
     * 创建移动端支付宝支付
     * @param orderId redis缓存id
     * @return 支付宝支付订单
     * @throws AlipayApiException 支付宝异常
     */
    Result gotoWapAlipay(String orderId) throws AlipayApiException;

    /**
     * 根据订单编号去取消订单信息
     * @param code 订单编号
     * @return 操作结果
     * @throws SchedulerException 定时任务异常
     */
    Result cancelOrderByCode(String code) throws SchedulerException;
}
